from functools import wraps

from cfg import db


# 定义一个装饰器函数，用于开启和提交事务
def transactional(func):
    """
    通常情况下，当你在数据库会话（session）中执行 db.session.add(data) 时，
    并不会立即将数据写入数据库。相反，数据会在事务提交时才会被写入数据库。
    而使用 db.session.flush() 可以强制将数据写入数据库，但并不结束事务。
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            # 开启事务
            # 调用被装饰的函数
            result = func(*args, **kwargs)
            # 提交事务
            return result
        except Exception as e:
            # 回滚事务
            db.session.rollback()
            raise e
        finally:
            db.session.commit()

    return wrapper
